#ifndef _JL_WIFI_PROV_MGR_H_
#define _JL_WIFI_PROV_MGR_H_

#include "system/includes.h"

#ifdef __cplusplus
extern "C" {
#endif

// syscfg 自定义ID
#define WIFI_PROV_CFG_ID 0x002

// 配网标志
#define WIFI_PROV_MAGIC_NORMAL 0x000000AB    // 正常启动（STA）
#define WIFI_PROV_MAGIC_NEED_PROV 0x0000AB01 // 进入AP配网
#define WIFI_PROV_MAGIC_FACTORY 0x0000ABFF   // 恢复出厂（清空后走配网）

#define WIFI_PROV_DEFAULT_CONFIG() { \
    .ap_ssid_prefix = "AIBOT_", \
    .ap_password = "", \
    .captive_portal_ip = 0xC0A80801, \
}

typedef struct
{
    u32 magic;
    char ssid[64];
    char pwd[64];
    u32 crc;
} wifi_prov_nv_t;

typedef enum
{
    WIFI_PROV_DESIRED_NONE = 0,
    WIFI_PROV_DESIRED_AP,
    WIFI_PROV_DESIRED_STA,
} wifi_prov_desired_mode_t;

typedef struct
{

    void (*on_store_sta_info)(const char *ssid, const char *pwd);
    void (*on_clear_sta_info)(void);

    void (*on_wifi_sta_mode)(const char *ssid, const char *pwd);
    void (*on_wifi_ap_mode)(void);


    // 开始配网
    void (*on_start)(void);
    // 停止配网
    void (*on_stop)(void);
    // 配网成功
    void(*on_finished)(void);
    // 配网错误
    void(*on_error)(void);
    // 配网超时
    void (*on_timeout)(void);
} wifi_prov_ops_t;

typedef struct
{
    // AP配置
    char ap_ssid_prefix[32];
    char ap_password[64];

    uint32_t captive_portal_ip;

    wifi_prov_ops_t ops;
} wifi_prov_cfg_t;

int wifi_prov_mgr_init(wifi_prov_cfg_t *cfg);

/**
 * 用户出发进入配网模式
 */
int wifi_prov_mgr_trigger_ap(void);

/**
 * 用户出发进行恢复出厂设置
 */
int wifi_prov_mgr_factory_reset(void);

/**
 * 读取并决定启动模式（根据NV），返回建议模式；由上层在 WIFI_EVENT_MODULE_INIT 中决定并调用
 */
wifi_prov_desired_mode_t wifi_prov_mgr_get_desired_mode(void);

/**
 * 截取wifi event处理
 */
int wifi_prov_mgr_on_wifi_evt(void *network_ctx, enum WIFI_EVENT event);

#ifdef __cplusplus
}
#endif

#endif // _JL_WIFI_PROV_MGR_H_